Date :...........................................17 et 28 mai 1991
Protection : ..................................MOT DE PASSE
Programme : ......................................4D BOXING
Outils : ......................................SOFT-ICE V2.50a
Fichier : ................................................LOAD.EXE
Temps passé : ........................12 HEURES environ...
Société :........................................... MINDSCAPE
Divers : .....Premier emploi du débuggeur SOFT-ICE.
Origine : ............................................................B.Y.
Numéro : ...........................................................076

 

	Avant de commencer je passe tous les *.EXE à l'UNPACK de MS et celui
	de FB.
	LOAD.EXE était compacté avec EXEPACK de MS et curieusement retrouve
	une taille inférieure à celle qu'il a lorsqu'il est compacté !
	Cinq points pour SOFT-ICE:
	a-      Il apparaît à chaque sollicitation que l'on se trouve au fond
		de WINDOWS ou d'un autre graphisme VGA/EGA/CGA/TEXT.
		( pas le cas de PERISCOPE V2.11 )
	b-      Aucune perte d'image lors d'un retour de SOFT-ICE vers le
		programme. ( pas le cas de PERISCOPE V2.11 )
	c-      Tous les points d'arrêts sont exécutés sans problème en FULL
		SPEED. ( pas le cas de PERISCOPE V2.11 )
	d-      Se place lors de l'installation tout en haut de la mémoire
		ce qui fait que le programme à débugger est chargé à son
		CS:IP normal. ( pas le cas de PERISCOPE V2.11 )
	e-      Permet d'être appelé par une NMI ( ma carte PANO ). En fait
		TD de BORLAND a aussi cette possibilité.
	Avec toutefois deux inconvénients:
	a-      Ne permet pas de BREAK POINT sur les REGISTRES. ( a moins que je ne
		sache pas lire la doc ! ) 
	b-      Ne permet pas de rediriger la sortie écran dans un fichier.
	Donc avec SOFT-ICE le programme se déroule normalement. ( impossible de
	charger 4D BOXING avec PERISCOPE ) et on trouve cette chaîne codée 
	dans laquelle il suffit d'inverser le saut 750B en 740B:
	83C404
	0BC0
	750B    ---->  à modifier par 740B ou 9090 
	C70610
	Cette chaîne étant codée je pars à la recherche de mon 0B que je veux
	transformer en 00.
	Il se trouve dans le fichier EGA.CMN en 090B101216181E26. Je le modifie
	et tout se plante. C'est curieux cette incrémentation des octets à cet
	endroit...
	J'essaie autre chose; il suffit que AX soit égal à 0000 lors du test.
	Je remonte en amont et je place dans une sous-routine XOR AX,AX.
	Cela se plante aussi...
	Fichier LOAD.EXE;       74d4
				1AC0
				1CFF    ---> 33C0       XOR AX,AX
				98
				8BF2
	Alors que la modif faite "ON LINE" le soft tourne. Il y a donc un test
	plus loin ou autre chose...
	Je vais essayer de pousser SOFT-ICE dans ces limites pour voir ce qu'il
	est capable de faire.
	28 mai 1991
	Le fichier EGA.CNM semble être compacté. ( aucune répétition de 
	caractère ) 
	Je place SOFT-ICE en arrêt sur adresse à l'écriture de mon 75.
	
	BPM 21B4:1BE9 W EQ 75
	Et SOFT-ICE s'y arrête à tout les coups. On se trouve dans la routine
	qui mets en place la sous-routine de demande du mot de passe avec un
	STORB:
	Le STORB pointe sur ES:DI qui est égal à 1C73:6FF9 ce qui est bien
	égal à 21B4:1BE9 !
	L'idée est de faire comme avec FINAL ORBIT c'est à dire greffer un
	peu de code qui teste la valeur en ES:DI et qui décrémente de 1 si
	la case mémoire correspondante est égale à 75. Car cette position
	corrigée avec 74 fait fonctionner le SOFT sans mot de passe.
	Routine de codage originale:      
	771C:02AD 3ACC          CMP  CL,AH                             
	771C:02AF 7E0B          JLE  02BC       
	771C:02B1 86CC          XCHG CL,AH      
	771C:02B3 D3C2          ROL  DX,CL      
	771C:02B5 86CC          XCHG CL,AH      
	771C:02B7 2ACC          SUB  CL,AH
	Routine modifiée:
	
	Le NOP après le JMP sert à réaligner le nombre d'octet en ne 
	modifiant pas le code qui suit. 
	771C:02AD 3ACC          CMP  CL,AH                             
	771C:02AF 7E0B          JLE  02BC       
	771C:02B1 E9EC35        JMP  38A0      
	771C:02B4 90            NOP      
	771C:02B5 86CC          XCHG CL,AH      
	771C:02B7 2ACC          SUB  CL,AH
	Je passe énormément de temps pour trouver une zone du programme qui
	représente du texte et qui n'est pas altérée par la suite. Je me fais
	bien sur piéger par le fait que la routine écrit deux fois les mêmes
	caractères dans la même position mais entre les deux le programme à
	utilisé les positions que j'avais repérées.
	Finalement je trouve quelque chose qui semble rester du début jusqu'à
	la demande du mot de passe. C'est une suite de 00 puis du texte
	correspondant au compilateur MICROSOFT. Il n'y a aucune raison que
	ceci soit utilisé.
	Deux erreurs d'écriture de mon mini-code me font encore une fois perdre
	un temps fou: comme je veux modifier la position ES:DI je teste 
	évidement cette position ce qui fait que j'altère les FLAGS !
	Je dois donc commencer par les sauver sur la pile et les restaurer dès
	la fin de mon action.
	Deuxième erreur: comme je teste la position ES:DI et non pas ES:6FF9
	il se produit la chose suivante; d'autre 75 apparaissent pour des 
	valeurs de DI autres que 6FF9 et qu'automatiquement je transforme en
	74 !!! donc plantage assuré.
	IP:
	38A0 9C             PUSHF                ; sauvegarde des FLAGS.
	38A1 26803EF96F75   CMP BYTE ES:6FF9,75  ; ( es: = 21B4 )
	38A7 7505       ÉÍ< JNZ 38AE             ; si pas d'égalité on 
			º                        ; saute la décrémentation.
	38A9 26FE0EF96F º   DEC BYTE ES:6FF9     ; on décrémente ES:6FF9 de 1.
	38AE 9D       <ͼ   POPF                 ; restaure les FLAGS.
	38AF 86CC           XCHG CL,AH           ; je remets les instructions 
						 ; qui ont du être déplacées 
						 ; l'insertion de mon JMP.        
	38B1 D3C2           ROL DX,CL              
	38B3 E9FFC9         JMP 02B5   ÍÍÍÍÍÍÍÍÍ>; retour à 02B5.
	
	Avec PCTOOLS chercher la chaîne 3ACC7E0B86CCD3C2 et modifier comme
	suit: 3ACC7E0BE9EC3590 sans oublier de décompacter le fichier LOAD.EXE
	avant avec l'utilitaire de FABRICE BELLARD: UPACKEXE.
	Puis chercher en SL 41 DEP 400 ( décimal )  et y placer:
	9C26803EF96F75750526FE0EF96F9D86CCD3C2E9FFC9
	Cette modif. fonctionne en EGA et VGA.
	21 novembre 1991        
	N'ayant pas sauvegardé le fichier LOAD.EXE modifié, j'ai eu un mal de
	chien pour refaire ce patch car je m'étais trompé dans la rédaction des
	chaînes d'octets. Impossible de repasser avec SOFT-ICE par l'endroit
	que je venais de modifier à l'aide de PCTOOLS. Il existe pourtant une
	méthode infaillible pour appeler un débuggeur quel qu'il soit à un
	endroit donné. Il suffit d'inclure au début de la chaîne un octet CC.
	Il faut bien sur prendre garde de le placer après ou avant une 
	instruction et non pas au milieu.
	PERISCOPE s'arrête automatiquement tandis que SOFT-ICE doit être mis
	en BPINT 3.
	FREDDY